/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.svc.Exercise;

import com.myapp.model.DAO.Exercise.ExerciseDao;
import com.myapp.model.DAO.Notifications.NotificationsDao;
import com.myapp.model.DAO.User.UserDao;
import com.myapp.model.ejercicios.Ejercicios;
import com.myapp.model.notificaciones.Notificaciones;
import com.myapp.model.resueltos.Resueltos;
import com.myapp.model.tipos.Tipos;
import com.myapp.model.usuarios.Usuarios;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Tarde
 */
public class ExerciseSvc {

    ExerciseDao exerDao = new ExerciseDao();
    UserDao usr = new UserDao();

    public List listarPorTema(String idTema, Usuarios usr) {
        List listEjercicio = null;
        listEjercicio = exerDao.listarPorTema(idTema, usr);
        return listEjercicio;
    }

    public Ejercicios listarPorId(String idEjercicio) {
        Ejercicios ejer = new Ejercicios();
        ejer = exerDao.listarPorId(idEjercicio);
        return ejer;
    }

    public void reportar(Ejercicios ejer, Usuarios usr) {
        exerDao.reportar(ejer, usr);
    }

    public Resueltos selectExercResolvePorId(String idResueltos) {
        Resueltos ejer = new Resueltos();
        ejer = exerDao.selectExercResolvePorId(idResueltos);
        return ejer;
    }

    public void selectExercToResolve(Resueltos resolve) {

        //Pasar ejercicio seleccionado a resuelto
        exerDao.selectExercToResolve(resolve);

        /**
         * Cambiar disponibilidad para corregir del autor del ejercicio la
         * @disminuimos porque han seleccionado un ejercicio suyo y deberá
         * corregirlo posteriormente
         */
        Usuarios userAutor = null;
        userAutor = resolve.getEjercicios().getUsuarios();
        usr.disminuirDisponCorreg(userAutor);
    }

    public Resueltos resolveExercise(Resueltos result, int userAutor) {
        result = exerDao.resolveExercice(result);

        if (result != null) {
            try {
                // Emisor
                Usuarios idEmisor = result.getUsuarios();

                // Receptor: el autor del ejercicio para enviarle la notifiación                
                Usuarios user = new Usuarios();
                user.setIdusuario(userAutor);
                List listUserAutor = new ArrayList();
                listUserAutor.add(user);

                //Creamos la notificación con el usuario emisor y su tipo
                Notificaciones notif = new Notificaciones();
                Tipos tipoNotific = new Tipos();
                tipoNotific.setIdtipo(Integer.valueOf("6"));
                notif.setUsuariosByIdemisor(idEmisor);
                notif.setTipos(tipoNotific);

                //Enviamos la notifiación
                NotificationsDao notifDao = new NotificationsDao();
                notifDao.sendNotifications(notif, listUserAutor);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return result;
    }

    /**
     * autor: VSD 
     * descr: Inserta nuevo ejercicio newOrUpdate == true o Actualiza
     * ejercicio newOrUpdate == false Si ha encontrado algún error devolverá
     * nulo
     *
     * @param exer
     * @param newOrUpdate
     * @return
     * @throws NoSuchAlgorithmException
     */
    public Ejercicios newOrUpdateExercise(Ejercicios exer) throws NoSuchAlgorithmException {

        Ejercicios toReturn = new Ejercicios();

        if (exer.getIdejercicio()==null) {// Caso de nuevo ejercicio.

            Ejercicios exerSearch = new Ejercicios();
            exerSearch = exerDao.search(exer);
            if (exerSearch == null) {
                toReturn = exerDao.newOrUpdateExercise(exer);
            } else {
                toReturn = null;
            }

        } else {//Caso de Update de ejercicio 

            toReturn = exerDao.newOrUpdateExercise(exer);
        }
        return toReturn;
    }

    /**
     * autor: VSD 
     * descr: Si encuentra ese  ejercicio con estado "mandado" o "elegido" 
     * devuelve true porque no se podrá eliminar ni editar el ejercicio
     */
    public boolean exerciseLock(Ejercicios exer) {
        boolean lock = false;
        ExerciseDao exerDao = new ExerciseDao();
        lock = exerDao.exerciseLock(exer);
        return lock;
    }

    public List listEjerNoResueltos(int idUser) {
        List noResueltos = null;
        noResueltos = exerDao.listaEjercNoResueltos(idUser);
        return noResueltos;
    }

    public List listEjerNoCorregidos(int idUser) {
        List noResueltos = null;
        noResueltos = exerDao.listaEjercNoCorregidos(idUser);
        return noResueltos;
    }

    /**
     * autor: VSD descr: Si encuentra un ejercicio (no desactivado) con el mismo id decvuelve 
     * devuelve, en caso contrario devuelve null
     */
    public Ejercicios searchById(Ejercicios exer) {
        Ejercicios resultado = exerDao.searchById(exer);
        return resultado;
    }

    /**
     * autor: VSD descr: Si encuentra un ejercicio (no desactivado) con el mismo título lo
     * devuelve, en caso contrario devuelve null
     */
    public Ejercicios search(Ejercicios exer) {
        Ejercicios resultado = exerDao.search(exer);
        return resultado;
    }
    
    /**
     * autor: VSD 
     * descr: Devuelve la lista de ejercicios de un usuario con los datos de cada ejercicio 
     * @param usuario
     * @return 
     */
    public List<Ejercicios> listMyExercises(Usuarios usuario) {
        List<Ejercicios> resultado = exerDao.listMyExercises(usuario);
        return resultado;
    }       
    
    /**
     * autor: VSD
     * descr: true si ha conseguido eliminarlo (desactivar ejercicio), false en otro caso
     * 
     * @param ejercicio
     * @return 
     */
    public boolean deleteExercise(Ejercicios ejercicio) {
        boolean exito = exerDao.deleteExercise(ejercicio);
        return exito;
    }
    public void corregido(Resueltos res){
        
        exerDao.corregido(res);
    }
}
